/*
 * threadEscuchas.cpp
 *
 *  Created on: 24/10/2010
 *      Author: teledhil
 */

#include <netinet/in.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "consola.h"
#include "comunicacion.h"
#include "downloads.h"
#include "variablesGlobales.h"

#define UNUSED(x) ((void)(x))

void *funcion_downloads(void *arg) {
	char buffer[BIG_BUFFER + 1] = "";
	int leido;
	long leido_total = 0l;
	uint32_t leido_respuesta; //uint32_t es de 4 bytes
	mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

	bool *deboMorir;

	deboMorir = (bool *) arg;

	output_debug("Hilo_downloads: Hilo en ejecucion!");

	//Abre fichero destino
	if (file_dl_fd > 0) {
		output_program(
				"Unable to download file. Another file is being downloaded");
		output_debug("file_dl_fd=%d", file_dl_fd);
		output_debug("Hilo_downloads: Muero");
		cerrar_conexion(socketDownload);
		socketDownload = 0;
		return NULL;
	}
	if ((file_dl_fd = creat(file_dl_path, mode)) < 0) {
		output_program("Unable to share file.");
		output_error("%s", strerror(errno));
		file_dl_fd = 0;
		output_debug("Hilo_downploads: Muero");
		cerrar_conexion(socketDownload);
		socketDownload = 0;
		return NULL;
	}

	//Comienza la descarga
	output_program("Downloading file %s", file_dl_path);
	while (!state_powerOff && !(*deboMorir)) {
		if (state_sleep > 0) {
			sleep(state_sleep);
		}
		if (socketDownload > 0) {
			if ((leido = recibir_mensaje(socketDownload, buffer, 1))
					> 0) {
				//output_debug("funcion_downloads: Leo: |%d|", leido);
				//Almacena buffer leido en el fichero
				if (write(file_dl_fd, buffer, leido) < 0) {
					output_error("Fallo descarga fichero");
					cerrar_conexion(file_dl_fd);
					file_dl_fd = 0;
					//cerrar_conexion(socketDownload);
					socketDownload = 0;
					return NULL;
				}
				//ack del ultimo byte leido
				leido_total += leido;
				leido_respuesta = htonl(leido_total);
				if (enviar_mensaje(socketDownload, (char *) &leido_respuesta,
						sizeof(uint32_t)) < 0) {
					output_debug("funcion_downloads: error enviar_mensaje");
				}
				//output_debug("ack=%ld", ntohl(leido_respuesta));
			} else if (leido < 0) {
				output_debug("funcion_downloads: Conexion cerrada");
				output_debug("Hilo_downloads: Muero");
				output_program("Finished download of file %s", file_dl_path);
				cerrar_conexion(file_dl_fd);
				file_dl_fd = 0;
				//cerrar_conexion(socketDownload);
				socketDownload = 0;
				return NULL;
			}
		} else {
			output_debug("funcion_downloads: Muero! (socket invalido");
			output_error("Fallo descarga fichero");
			cerrar_conexion(file_dl_fd);
			file_dl_fd = 0;
			//cerrar_conexion(socketDownload);
			socketDownload = 0;
			return NULL;
		}

	}
	output_program("Finished download of file %s", file_dl_path);
	output_debug("Hilo_downloads: Muero");

	output_error("Fallo descarga fichero");
	//Cierra fichero destino
	cerrar_conexion(file_dl_fd);
	file_dl_fd = 0;
	//Cierra socket descarga
	//cerrar_conexion(socketDownload);
	socketDownload = 0;
	return NULL;
}
